package wells.http;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;

public class HttpServer {

	private final int port;

	public HttpServer(int port) {
		this.port = port;
	}

	public static void main(String[] args) throws Exception {

		int port = 10000;
		new HttpServer(port).start();
	}

	public void start() throws InterruptedException {
		ServerBootstrap b = new ServerBootstrap();
		NioEventLoopGroup group = new NioEventLoopGroup();
		b.group(group).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {
			@Override
			public void initChannel(SocketChannel ch) throws Exception {
				System.out.println("initChannel ch:" + ch);
				HttpRequestDecoder decoder = new HttpRequestDecoder();
				HttpResponseEncoder encoder = new HttpResponseEncoder();
				HttpObjectAggregator aggregator = new HttpObjectAggregator(512 * 1024);
				HttpHandler handler = new HttpHandler();
				ch.pipeline().addLast("decoder", decoder) // 1
						.addLast("encoder", encoder) // 2
						.addLast("aggregator", aggregator) // 3
						.addLast("handler", handler); // 4
			}
		}).option(ChannelOption.SO_BACKLOG, 128) // determining the number of connections queued
				.childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE);

		b.bind(port).sync();
	}
}